package com.example.wzdjcrdpassword.service;

import com.example.wzdjcrdpassword.cache.ConfigCacheManager;
import com.example.wzdjcrdpassword.entity.Config;
import com.example.wzdjcrdpassword.repository.ConfigRepository;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class ConfigService {

    @Resource
    private ConfigRepository configRepository;

    @Resource
    @Lazy
    private ConfigCacheManager configCacheManager;
    
    /**
     * 验证配置是否可用
     * @param configType 配置类型
     * @param configKey 配置key
     * @param configValue 配置值
     * @return 验证结果
     */
    public boolean validateConfig(String configType, String configKey, String configValue) {
        Optional<Config> configOpt = configRepository
                .findByTypeKeyValueAndAvailable(configType, configKey, configValue);
        
        return configOpt.isPresent();
    }
    
    /**
     * 获取所有有效配置
     * @return 配置列表
     */
    public List<Config> getAllAvailableConfigs() {
        return configRepository.findAllAvailableConfigs();
    }
    
    /**
     * 获取配置详细信息（带缓存）
     * @param configType 配置类型
     * @param configKey 配置key
     * @param configValue 配置值
     * @return 配置信息
     */
    public Optional<Config> getConfigInfo(String configType, String configKey, String configValue) {
        // 先从缓存获取
        Optional<Config> configOpt = configCacheManager.getConfigFromCache(configType, configKey);
        
        if (configOpt.isPresent()) {
            return configOpt;
        }
        
        // 缓存中没有，从数据库获取
        configOpt = configRepository.findByTypeKeyValueAndAvailable(configType, configKey, configValue);
        
        // 如果数据库中有，放入缓存
        configOpt.ifPresent(config -> configCacheManager.addConfigToCache(config));
        
        return configOpt;
    }
    
    /**
     * 三合一接口专用配置验证（带缓存）
     * @param configType 配置类型
     * @param configKey 配置key
     * @param configValue 配置值
     * @return 配置信息（如果验证通过）
     * @throws RuntimeException 配置验证失败时抛出异常
     */
    public Config validateConfigForCombined(String configType, String configKey, String configValue) {
        // 先从缓存获取
        Optional<Config> configOpt = configCacheManager.getConfigFromCache(configType, configKey);
        
        if (configOpt.isEmpty()) {
            // 缓存中没有，从数据库获取
            configOpt = configRepository.findByTypeKeyValueAndAvailable(configType, configKey, configValue);
            
            // 如果数据库中有，放入缓存
            configOpt.ifPresent(config -> configCacheManager.addConfigToCache(config));
        }
        
        if (configOpt.isEmpty()) {
            throw new RuntimeException("配置不存在");
        }
        
        Config config = configOpt.get();
        if (!configValue.equals(config.getConfigValue())) {
            throw new RuntimeException("配置值不匹配");
        }
        
        return config;
    }
    
    /**
     * 刷新配置缓存
     */
    public void refreshConfigCache() {
        configCacheManager.refreshCache();
    }
}